#ifndef IMAGEMANAGEMENTPLUGIN_H
#define IMAGEMANAGEMENTPLUGIN_H

#include "CameraPluginInterface.h"
#include <QObject>
#include "ImageCacheManager.h"
#include "UndoRedoManager.h"
#include "ImagePreprocessingSettings.h"
class ImagePreviewWidget; // 前向声明
class QImage; // 前向声明：用于静态回调签名
//图像更新回调函数定义
using CameraUpdateImageCallback=std::function<void(const QWidget*,const QImage &)>;
class ImageManagementPlugin : public CameraPluginInterface {
    Q_OBJECT
    Q_INTERFACES(CameraPluginInterface)
    Q_PLUGIN_METADATA(IID "Camera.CameraPluginInterface/1.0")
    Q_PROPERTY(QString pluginName READ pluginName CONSTANT)
    Q_PROPERTY(QString description READ description CONSTANT)
public:
    Q_INVOKABLE explicit ImageManagementPlugin(QObject *parent = nullptr);
    ~ImageManagementPlugin() override;

    void initialize() override;
    QString pluginName() const override;
    QString description() const override;
public slots:
    // 通用消息接收槽（支持跨插件调用）
    void onPluginMessage(const QString& sender, const QString& message) override;
    
    // 处理图像注册请求的槽函数
    void onRequestRegisterImageDisplay(const QString &imageGuid);
    
    // 处理显示图像请求的槽函数
    void onDisplayImageRequested(const QString &imageGuid);
    
    // 处理切换到指定图形显示窗口的信号
    void onSwitchToPreviewItem(const QString &imageGuid);
    
    // 处理图像从缓存中删除的槽函数
    void onImageRemovedFromCache(const QString &imageGuid);
    
    // 处理从主框架发下来的切换图形显示窗口信号
    void onSwitchToGraphicsDisplayWidget(const QString &graphicsGuid);
    
    // 处理撤销操作请求的槽函数
    void onUndoRequested(const QString &imageGuid);
    
    // 处理重做操作请求的槽函数
    void onRedoRequested(const QString &imageGuid);

    //图像预处理设置
    void onImagePreprocessingSetting(int result);
    
public:
    // 获取图像长度转换比例
    Q_INVOKABLE QVariant getImageLengthRatio(const QVariant &imageGuid);
    
    // 获取当前选中图像的GUID
    Q_INVOKABLE QVariant getCurrentSelectedImageGuid();
    
    // 设置图像长度转换比例
    Q_INVOKABLE QVariant setImageLengthRatio(const QVariant &imageGuid, const QVariant &ratio);
    
    // 获取图像时间转换比例
    Q_INVOKABLE QVariant getImageTimeRatio(const QVariant &imageGuid);
    
    // 设置图像时间转换比例
    Q_INVOKABLE QVariant setImageTimeRatio(const QVariant &imageGuid, const QVariant &ratio);
    
    // 获取图像波长转换比例
    Q_INVOKABLE QVariant getImageWavelengthRatio(const QVariant &imageGuid);
    
    // 设置图像波长转换比例
    Q_INVOKABLE QVariant setImageWavelengthRatio(const QVariant &imageGuid, const QVariant &ratio);
    
    // 获取图像单位
    Q_INVOKABLE QVariant getImageLengthUnit(const QVariant &imageGuid);
    Q_INVOKABLE QVariant getImageTimeUnit(const QVariant &imageGuid);
    Q_INVOKABLE QVariant getImageWavelengthUnit(const QVariant &imageGuid);
    
    // 设置图像单位
    Q_INVOKABLE QVariant setImageLengthUnit(const QVariant &imageGuid, const QVariant &unit);
    Q_INVOKABLE QVariant setImageTimeUnit(const QVariant &imageGuid, const QVariant &unit);
    Q_INVOKABLE QVariant setImageWavelengthUnit(const QVariant &imageGuid, const QVariant &unit);
    
    // 一次性设置所有转换信息
    Q_INVOKABLE QVariant setImageConversionInfo(const QVariant &imageGuid, const QVariant &lengthRatio, const QVariant &timeRatio, const QVariant &wavelengthRatio, const QVariant &lengthUnit, const QVariant &timeUnit, const QVariant &wavelengthUnit, const QVariant &xAxisUnit, const QVariant &yAxisUnit);
    
    // 一次性获取所有转换信息
    Q_INVOKABLE QVariant getImageConversionInfo(const QVariant &imageGuid);
    
    // 设置默认保存路径
    Q_INVOKABLE QVariant setDefaultSavePath(const QVariant &path);
    
    // 获取默认保存路径
    Q_INVOKABLE QVariant getDefaultSavePath();
    
    // 设置默认保存格式
    Q_INVOKABLE QVariant setDefaultSaveFormat(const QVariant &format);
    
    // 获取默认保存格式
    Q_INVOKABLE QVariant getDefaultSaveFormat();
    
    // 更新原始图像
    Q_INVOKABLE QVariant updateOriginalImage(const QVariant &imageGuid, const QVariant &originalImage);
    
    // 更新处理后图像
    Q_INVOKABLE QVariant updateProcessedImage(const QVariant &imageGuid, const QVariant &processedImage, const QVariant &params);
    
    // 获取原始图像
    Q_INVOKABLE QVariant getOriginalImage(const QVariant &imageGuid);
    
    // 获取处理后图像
    Q_INVOKABLE QVariant getProcessedImage(const QVariant &imageGuid);

    // 获取处理后图像
    Q_INVOKABLE QVariant getDisplayImage(const QVariant &imageGuid);
    
    // 撤销上一步操作
    Q_INVOKABLE QVariant undo(const QVariant &imageGuid);
    
    // 重做上一步操作
    Q_INVOKABLE QVariant redo(const QVariant &imageGuid);
    
    // 检查是否可以撤销
    Q_INVOKABLE QVariant canUndo(const QVariant &imageGuid);
    
    // 检查是否可以重做
    Q_INVOKABLE QVariant canRedo(const QVariant &imageGuid);
    
    // 获取当前可执行操作（undo或redo）的值
    // 用于直接获取操作的值，不需要返回已经通过其他方式获取的操作类型和描述
    Q_INVOKABLE QVariant getCurrentOperationValue(const QVariant &imageGuid);
    
    // 添加处理参数
    Q_INVOKABLE QVariant addImageProcessingParam(const QVariant &imageGuid, const QVariant &params);
    
    // 移除处理参数
    Q_INVOKABLE QVariant removeImageProcessingParam(const QVariant &imageGuid, const QVariant &index);
    
    // 清除所有处理参数
    Q_INVOKABLE QVariant clearImageProcessingParams(const QVariant &imageGuid);
    
    // 获取所有处理参数
    Q_INVOKABLE QVariant getAllImageProcessingParams(const QVariant &imageGuid);
    
    // 获取特定索引的处理参数
    Q_INVOKABLE QVariant getImageProcessingParam(const QVariant &imageGuid, const QVariant &index);
    
    // 判断图像是否经过指定算法处理
    Q_INVOKABLE QVariant isImageProcessedByAlgorithm(const QVariant &imageGuid, const QVariant &algorithmName);

private:
    // 处理捕获的图像（友元自由函数）
    friend void handleCapturedImage(QObject* ctx, const QString &imageGuid, const QImage &image, int triggerMode);

     // 更新图像显示的辅助方法
     void updateImageDisplay(const QString &imageGuid);
signals:
     void updateCameraImage(const QImage& image);
private:
    ImagePreviewWidget *m_pPreviewWidget; // 图像预览组件指针
    ImageCacheManager *m_imageCacheManager; // 图像缓存管理器
    ImagePreprocessingSettings *m_ImagePreprocessingSettings;//图形预处理设置
    UndoRedoManager *m_undoRedoManager; // 撤销重做管理器
    CameraUpdateImageCallback m_CameraUpdateImageCallback;//相机实时图像更新函数
};
void handleCapturedImage(QObject* ctx, const QString& imageGuid, const QImage& image, int triggerMode);
#endif // IMAGEMANAGEMENTPLUGIN_H
